#ifndef __MYSTRING_H_
#define __MYSTRING_H_

#include <iostream>

class MyStringArray; // 前置声明
class MyString    // 一个自定义的字符串类型
{
public:
    MyString();
    MyString(const char *str);
    MyString(const MyString &string);
    MyString &operator=(const MyString &string);
    ~MyString();

    MyString &operator+=(const MyString &string); // += 给的是左值
    MyString &operator+=(const char &c);
    MyString operator+(const MyString &string);   // 加 给的是右值
    MyString &operator-=(const MyString &string);  
    MyString operator-(const MyString &string);

    char &operator[](int index); // 查和改

    bool operator==(const MyString &string);
    bool operator!=(const MyString &string);

    // bool operator&&(const MyString& string);

    // 类型转换运算符重载
    operator int();
    operator double();
    
    // 字符串切割
    MyStringArray split(const MyString& delim);

    friend std::ostream &operator<<(std::ostream &os, const MyString &string);
    friend std::istream &operator>>(std::istream &is, MyString &string);

private:
    void ReSize(int capacity);
    char *s;    // 指向字符数组的指针，用来存储字符串的实际内容
    int size;
    int capacity;
};

std::ostream& operator<<(std::ostream &os,const MyString& string);
std::istream& operator<<(std::istream &is,MyString& string);

class MyStringArray  // 动态数组类
{
public:
   MyStringArray();
   MyStringArray(const MyStringArray &a);
   MyStringArray &operator=(const MyStringArray &a);
   ~MyStringArray();
   
   // + -= == [] >> 重载完之后放到动态库中
   MyStringArray &operator+=(const MyString &str);
   friend std::ostream& operator<<(std::ostream& os,const MyStringArray &a);

private:
   MyString *array; // 指向MyString类的对象的指针数组，用于存储多个MyString对象
   int size;    // 当前数组中存储的MyString类的数量
   int capacity;  // 数组的最大容量，表示可以存储的 MyString 对象的数量。
};

std::ostream& operator<<(std::ostream& os,const MyStringArray &a);

#endif
